package base.annotation_demo.demo_01;

import java.lang.annotation.*;

/**
 * 注解入门:
 * 1.jdk1.5后引入的新技术
 * 2.注解不是程序本身,对程序作出解释;可以被其他程序(编译器)读取,注解信息处理流程是注解和注释的最大区别,如果没有
 * 注解信息处理流程,则注解毫无意义.
 * 3.注解定义是通过@interface 注解名来声明一个注解,内部可以定义参数属性,参数类似普通Class里面定义的方法.
 * 如果只有一个参数,通常这个参数默认名叫value
 * 4.自定义注解自动继承了java.lang.annotation.Annotation接口
 * 5.元注解:负责注解其他注解,Java中有4个元注解(meta-annotation)- @Target,@Retention,@Documented,@Inherited
 *
 * @Target: 表明该注解可以使用的范围. ElementType.TYPE, ElementType.METHOD
 * @Retention: 表明注解的生命周期,在什么级别保留该注解信息.  RetentionPolicy.RUNTIME
 *  SOURCE: 在源文件中有效,即源文件中保留
 *  CLASS: 在class文件中有效,即class中保留
 *  RUNTIME: 在运行时有效,即运行时保留,为Runtime可以被反射机制读取.
 * @Document: 用在注解上的元注解,表明生成doc文档时这个注解一并生成到文档中.
 * @Inherited: 用在注解上的元注解,表明该注解是可以被继承的.比如B继承A,A上有个注解@C标了@Inherited,那么B上也就相当于标了@C
 *
 * 6. 注解作用有以下几点:
 * 1.编译器检查: @Override
 * 2.辅助生成 Java doc文档: @param -> javadoc -encoding utf-8 *.java  生成Java doc 文档
 * 3.代码分析(反射): 详见类 Student上注解
 *
 * 7. 编译与反编译
 * 编译: javac MyClass.java
 * 反编译: javap MyClass.class
 *
 * 8. 注解中属性返回值类型有以下几类: (注解本质上就是接口,属性就是抽象方法,但是返回值不同于接口)
 *    基本数据类型
 *    String类型
 *    枚举类型
 *    注解类型
 *    以上类型的数组类型
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IAnnotation {
    //注解中的成员变量定义格式都是方法定义格式，类型可以是基本类型、Class等类型格式
    String value() default "0";
    //String类型成员变量
    String  color();
    //int数组类型成员变量
    int[] arrayAttr() default {3,4,5};
    //注解类型成员变量,提供默认一个对象实例，注解实例对象产生方式：@注解名(成员变量)
    MetaAnnotation annotationAttr() default @MetaAnnotation(value = "abc") ;
}
